<!DOCTYPE html>
<html>

  <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <title>雕虫晓技(二) 编码</title>
  <meta name="description" content="本文是我工作这段时间的部分经验总结，仅从个人的角度谈一下对工作中编程的看法。">
  <meta name="author" content="GcsSloop">
  <meta name="keywords" content="Android">
  <meta name="关键字" content="Android">
  

  <meta name="twitter:card" content="summary">
  <meta name="twitter:title" content="雕虫晓技(二) 编码">
  <meta name="twitter:description" content="本文是我工作这段时间的部分经验总结，仅从个人的角度谈一下对工作中编程的看法。">
  <meta name="twitter:keywords" content="Android">
  
  <meta property="og:type" content="article">
  <meta property="og:title" content="雕虫晓技(二) 编码">
  <meta property="og:description" content="本文是我工作这段时间的部分经验总结，仅从个人的角度谈一下对工作中编程的看法。">
  <meta name="og:keywords" content="Android">

  <meta name="theme-color" content="#343434">
  
  <link rel="icon" type="image/png" href="https://raw.githubusercontent.com/GcsSloop/gcssloop.github.io/master/assets/siteinfo/favicon.png" />
  <link href="https://raw.githubusercontent.com/GcsSloop/gcssloop.github.io/master/assets/siteinfo/favicon.png" rel="shortcut icon" type="image/png">
  
  <link href="//netdna.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
  <link rel="stylesheet" href="/css/main.css">

  <link rel="canonical" href="http://www.gcssloop.com/gebug/coding">
  <link rel="alternate" type="application/rss+xml" title="GcsSloop" href="http://www.gcssloop.com/feed.xml">
  
  <meta name="google-site-verification" content="Z_g58PkzRAyBMxkqrcDdWrTBK8oOWM-7rUHauhLNF2E" />
  <meta name="baidu-site-verification" content="kUtTXCKaZs" />
  <meta name="baidu-site-verification" content="6DuDv3aaJX" />
  
  <!--阅读次数统计-->
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"> </script>
  
  <!--Fuck Weixin and Baidu-->
  <meta http-equiv="Cache-Control" content="no-transform">
  <meta http-equiv=”Cache-Control” content=”no-siteapp” />
  <meta name="applicable-device" content="pc,mobile">
  <meta name="HandheldFriendly" content="true"/>

  <!-- Google Ad -->
  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  <script>
    (adsbygoogle = window.adsbygoogle || []).push({
      google_ad_client: "ca-pub-2767831356529421",
      enable_page_level_ads: true
    });
  </script>

</head>


  <body>

    <span class="mobile btn-mobile-menu">
        <i class="fa fa-list btn-mobile-menu__icon"></i>
        <i class="fa fa-angle-up btn-mobile-close__icon hidden"></i>
    </span>
    
    <header class="panel-cover panel-cover--collapsed" style="background-image: url('/assets/siteinfo/background-cover.jpg')">
  <div class="panel-main">

    <div class="panel-main__inner panel-inverted">
    <div class="panel-main__content">

        <a href="/#blog" title="前往 GcsSloop 的主页" class="blog-button"><img src="/assets/siteinfo/avatar.jpg" width="80" alt="GcsSloop logo" class="panel-cover__logo logo" /></a>
        <h1 class="panel-cover__title panel-title"><a href="/#blog" title="link to homepage for GcsSloop" class="blog-button">GcsSloop</a></h1>

        
        <span class="panel-cover__subtitle panel-subtitle">Just do IT later.</span>
        
        <hr class="panel-cover__divider" />
        <p class="panel-cover__description">嗨，我是 GcsSloop，一名来自2.5次元的魔法师，Android自定义View系列文章作者，非著名程序员。</p>
        <hr class="panel-cover__divider panel-cover__divider--secondary" />
        
        
        <p class="panel-cover__description">欢迎来到我的魔法世界!</p>
        
        
        <div class="navigation-wrapper">
          <div>
            <nav class="cover-navigation cover-navigation--primary">
              <ul class="navigation">
                <li class="navigation__item"><a href="/#blog" title="访问博客" class="blog-button">博客</a></li>
                
                  
                    <li class="navigation__item"><a href="https://github.com/GcsSloop" target="_blank" title="GcsSloop's GitHub">GitHub</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/timeline" title="博客目录">目录</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="https://xiaozhuanlan.com/u/GcsSloop" target="_blank" title="小专栏">专栏</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/category/customview" title="自定义View教程目录">自定义控件</a></li>
                  
                  
                
                  
                    <li class="navigation__item"><a href="/friends" title="友链">友链</a></li>
                  
                  
                
              </ul>
            </nav>
          </div>
          
          <div><nav class="cover-navigation navigation--social">
  <ul class="navigation">

  
  <!-- Weibo -->
  <li class="navigation__item">
    <a href="http://weibo.com/GcsSloop" title="@GcsSloop 的微博" target="_blank">
      <i class='social fa fa-weibo'></i>
      <span class="label">Weibo</span>
    </a>
  </li>
  

  
  <!-- Github -->
  <li class="navigation__item">
    <a href="https://github.com/GcsSloop" title="@GcsSloop 的 Github" target="_blank">
      <i class='social fa fa-github'></i>
      <span class="label">Github</span>
    </a>
  </li>
  
  
  
  <!-- Twitter -->
  <li class="navigation__item">
    <a href="http://twitter.com/GcsSloop" title="@GcsSloop" target="_blank">
      <i class='social fa fa-twitter'></i>
      <span class="label">Twitter</span>
    </a>
  </li>
  

    

  

  
  <!-- RSS -->
  <li class="navigation__item">
    <a href="/feed.xml" rel="author" title="RSS" target="_blank">
      <i class='social fa fa-rss'></i>
      <span class="label">RSS</span>
    </a>
  </li>
  

  
  <!-- Email -->
  <li class="navigation__item">
    <a href="mailto:GcsSloop@gmail.com" title="发邮件给我">
      <i class='social fa fa-envelope'></i>
      <span class="label">Email</span>
    </a>
  </li>
  

  
  <!-- Copyright -->
  <li class="navigation__item">
    <a href="http://choosealicense.online" title="选择版权"  target="_blank">
      <i class="social fa fa-copyright"></i>
      <span class="label">版权</span>
    </a>
  </li>
  
  
  </ul>
</nav>
</div>
        </div>
      </div>
    </div>
    
    
    <div class="panel-cover--overlay cover-slate"></div>
    
  </div>
</header>


    <div class="content-wrapper">
        <div class="content-wrapper__inner">
            <article class="post-container post-container--single" itemscope itemtype="http://schema.org/BlogPosting">
  <header class="post-header">
    <div class="post-meta" style="font-size:.8em">
      <time datetime="2017-11-10 00:00:00 +0800" itemprop="datePublished" class="post-meta__date date">2017-11-10</time> &#8226; <span class="post-meta__tags tags">Android</span> &#8226; View <span id="busuanzi_value_page_pv"></span> times.
</span>
    </div>
    <h1 class="post-title">雕虫晓技(二) 编码</h1>
  </header>

  <section class="post">
    <h3 id="关于作者">关于作者</h3>

<p>GcsSloop，一名 2.5 次元魔法师。<br />
<a href="http://weibo.com/GcsSloop/home">微博</a> | <a href="https://github.com/GcsSloop">GitHub</a> | <a href="http://www.gcssloop.com/">博客</a></p>

<p><img src="http://gcsblog.oss-cn-shanghai.aliyuncs.com/blog/2019-04-29-073236.jpg?gcssloop" alt="" /></p>

<h3 id="前言">前言</h3>

<p>对于编程，一般需要先设计，再编码，即针对某一项功能进行详细的分析后，得出具体的技术方案，然后编码进行实现，这是最理想的状态，但是现实不可能这么理想。</p>

<p>在公司的项目中，一般不会有太充裕的时间，专一用来琢磨技术方案，再加上个人能力有限，前期分析很难具体到每一个细节中，那么在这种情况下应该如何编程呢？下面就分享几个自己使用的准则。</p>

<h3 id="一功能优先">一、功能优先</h3>

<p>程序员主要工作是写代码，最终目标则是产品，而产品的核心是其中的功能，如果功能没有完成，代码写得再漂亮也没用，所以第一点是功能优先。</p>

<p>由于每个人接触到的知识是非常有限的，不可能像搜索引擎一样什么都知道，所以在面对具体的功能开发时，要优先从自己现有的知识库里面寻找最可靠有效的解决方案，先利用已有的知识设计出大致的框架，然后在不考虑编码复杂度的情况下先完成第一个版本功能的开发，把功能做出来之后，再进行迭代优化，使其逐渐接近完美。</p>

<p>对于功能开发来说，也要注意偏重，用户需要的是内容，而不是一个应用，在初期阶段要注意将内容展示做好，至于其中的一些动画效果和细节处理，在这一阶段都属于次要内容，具体的细节可以等功能基本完善之后慢慢调整。</p>

<h3 id="二适当测试">二、适当测试</h3>

<p>测试有黑盒测试和白盒测试，黑盒测试就是把自己当成用户来体验这些功能，看功能是否正常，而白盒测试在Android中通常是指单元测试。</p>

<p>虽然公司有专业的测试人员，但是自己写的代码还是自己最清楚哪里可能出现问题，所以建议在交付给专业测试之前自己先简单的测试一遍，避免一些常见的漏洞。</p>

<p>在这里说明一下有关单元测试的问题，大家都知道单元测试是好的，但是据我观察，有很多程序员基本不写单元测试，那么单元测试到底是不是必须的呢？</p>

<p>个人觉得，是否进行单元测试要依照具体情况而定，不是所有的方法都需要单元测试，例如：读取数据库操作，获取网络数据，这些本身就不包含什么复杂逻辑的内容是不需要测试的，假如数据出现了问题，十有八九是其他地方写入了错误数据，而不是因为读取才出现的，因此这些也就没有必要进行测试了。具体的业务逻辑也不需要单元测试，否则产品一旦修改需求，测试代码也要跟着大动干戈，岂不是自找麻烦。</p>

<p>真正需要测试的是那些基础函数，尤其是具有分支判断的函数，这些函数才是最容易出现问题的地方，写测试代码的时候，重点要进行边界数值测试，以及特殊情况的测试，当然，如果是一些通用的基础组件，个人更喜欢写一个 Demo，在测试的同时就把用法示例也写出来了。</p>

<h3 id="三代码风格">三、代码风格</h3>

<p>相信每个人都有自己的编码风格，个人希望在保持自己风格的同时，也能够让别人更容易看懂自己的代码，所以设计了一个固定的结构，即适合编码，又适合阅读。</p>

<p>个人习惯将常量和变量放在最上面，然后是生命周期和应用的核心方法，依次进行排列，最后是外部调用的接口。这样做主要是为了后期查看方便，什么方法在什么位置很容易就能找到，避免了上下来回滚动去寻找一个方法的麻烦。</p>

<p>下面是自己使用的规范，一个大致的例子：</p>

<div class="highlighter-rouge"><pre class="highlight"><code>public class GcsSloop {    
    // 对外常量
    public static final String HAHA = "haha";    
    // 对内常量
    private static final int  mVal = -1;    
    // 全局变量
    private int mVar;    
   
    //--- 构造函数(生命周期)与核心功能 ---
    
    public GcsSloop() {        
        this(-1);
    }    
    public GcsSloop(int var) {        
        this.mVar = var;
    }    
    
    // 核心方法，一般均为 private
    private void doSomthing(){
        System.out.println("LALA");
    }
    
    //--- 对外方法或接口 ---
    
    // 对外方法，均为 public
    public void sayHaha(){
        System.out.println("HAHA");
    }
}
</code></pre>
</div>

<p>这样的编码风格也是我调整了若干次后总结的，规则很简单，也没有太大的束缚，但很实用。</p>

<p>一个类写完之后它的内部逻辑可能很长时间都不会改变，而调用者也不关心它的内部逻辑，所以就将内部逻辑放在中间位置，公开常量放在开头，接口放在结尾，相比于中间，开头和结尾更容易定位，这样在使用的时候最容易寻找。</p>

<p>例如：我之前写了一个类，我知道它的具体作用，但很长之前没有使用了，忘了怎么使用，我就可以打开这个类，直接跳到末尾看一下调用接口就知道怎么使用了，而不用再去看它的具体实现逻辑。</p>

<p>也有人习惯将公开常量和调用接口全部放在最开始的部分，这个就看个人的编码习惯了，<strong>只要不是把公开的方法接口混杂到具体内部逻辑中就好</strong>。</p>

<h3 id="四技术选型">四、技术选型</h3>

<p>最后一个话题是技术选型，有句俗话叫”条条大路通罗马”，在技术上尤其如此，对于同一个业务来说，不同的人进行开发可能会选择不同的技术方案，使用不同的思路。那么具体到我们开发时，应该如何选择方案呢？</p>

<p>个人觉得应该有以下几条原则：</p>

<p><strong>1. 首选自己实践过的</strong></p>

<p>如果是自己实践过的内容，会对这套流程比较熟悉，能快速上手开发，也踩过里面常见的坑，知道如何规避。所以这套是首选方案，可以快速稳定的实现业务。</p>

<p><strong>2. 次选官方推荐或者大家都在用的</strong></p>

<p>如果自己本身对这方面不熟悉，则建议选择官方推荐方案，或者用的人比较多的方案。对于官方推荐来说，有后台撑腰，文档清晰明确，使用起来会少走弯路。而使用人数较多的则说明有很多前人帮忙踩坑，很多坑在没遇到的时候就被填平了，即便遇到了，基本也能找到轻松绕过去的方案。</p>

<p><strong>3. 慎选热门新技术</strong></p>

<p>其实这一点有悖程序员文化，程序员都喜欢新潮的，酷酷的技术，而且使用新技术可以为将来的简历添加上浓墨重彩的一笔，所以很多程序员都喜欢使用新技术。</p>

<p>个人觉得，喜欢新技术没错，任何新技术的兴起，必然是因为它拥有着旧技术所没有的特点，才会受到人们的追捧，但也不要盲目的去使用新技术。对于新技术的出现，我们可以去学习，研究分析它的优缺点，但不要立即在商业项目中使用，因为任何技术都需要一定时间的沉淀才能逐渐完善，一项新技术的出现可能会解决某一方面的痛点，但同时也可能引入其他麻烦，如果使用新技术出现了麻烦，将没有任何可以参考的东西，只能去看源码分析，这将会大大的拖慢项目进度。</p>

<p><strong>对于新技术的出现，个人的观点是，默默学习，持续观望，等沉淀几个月之后再尝试将这项技术应用到实际的项目中。</strong></p>

<p><strong>4. 不选冷门技术</strong></p>

<p>如果不是迫不得已，不要去选择没什么人用的技术方案，这些方案没人使用一定是因为有更好的替代方案，或者是这项技术本身存在缺陷。当然，对于这些缺陷，作者一般不会明确的告诉我们。这些技术方案可能一开始使用起来没问题，但如果遇到问题，就会让人非常头疼，在某些情况下，修复这个问题所花费的时间甚至会超过自己从头再写一遍。所以使用冷门技术之前请先祈祷一下自己不会踩到坑。</p>

<h3 id="结语">结语</h3>

<p>以上这些内容都是个人工作这段时间内的感悟，也是根据自身能力，为自己定制的方案，并不适用于所有人，仅供大家参考。如果你有更好的想法，欢迎在公众号给我发消息，共同探讨学习。</p>

<p><strong>关于作者</strong></p>

<p>GcsSloop，一名 2.5 次元魔法师。</p>

    <hr>
  </section>
</article>

<!--广告-->

<!--
<div>
<a href="https://m.aliyun.com/act/team1111/?spm=5176.11533457.1089570.5.424777e3AF8WOJ&userCode=hn5smxtw#/" target="_blank"><img src="/assets/aliyun/1111-980-120.jpg" width="100%"></a>
</div>
-->
<!--捐赠晶石-->
<section class="contribute">
    <script type="text/javascript"> 
      function toggle() {
        var con = document.getElementById("contribute");
        if (con.style.display == "none") {
          con.style.display = "block";
        } else {
          con.style.display = "none";
        }
      }
    </script> 
    <blockquote style="background-color:#F5F5F5; padding: 10px 20px 20px 10px; margin:0px" >
      <h4> 如果你觉得我的文章对你有帮助的话，欢迎赞助一些服务器费用! </h4>
      <p></p>
      <a id=“btn-toggle-contribute” class="btn-contribute" onclick="toggle()" >¥ 点击赞助</a>
      <br>
      <div id="contribute" style="display:none;">
        <p align="center" >
        <img src="/assets/images/wechat.png" alt="微信">
        <img src="/assets/images/alipay.png" alt="支付宝">
        </p>
        <p align="left" >
          <b>感谢所有支持我的魔法师，所有支持过我的魔法师都可以通过微信(GcsSloop)联系我，获赠我的付费专栏！</b>
          <!--
          <a href="/contribute">点击这里查看捐赠者名单。</a>
          -->
        </p>
      </div>
    </blockquote>
</section>
<div>
  <h2>欢迎关注我的微信公众号</h2>
  <img src="/assets/images/banner.jpg" width="100%">
</div>

<!--阅读更多-->
<section class="read-more">
  
  
  <div class="read-more-item">
    <span class="read-more-item-dim">最近的文章</span>
    <h2 class="post-list__post-title post-title"><a href="/gebug/rclayout" title="link to 雕虫晓技(三) 通用圆角布局全解析">雕虫晓技(三) 通用圆角布局全解析</a></h2>
    <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客1. 前言之前，我在 GitHub 分享了一个开源库：rclayout，这个库的主要目的是快速实现 Andro...&hellip;</p>
    <div class="post-list__meta">
      <time datetime="2017-12-29 00:00:00 +0800" class="post-list__meta--date date">2017-12-29</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span>
      <br/><br/>
      <a style="float:none; margin:0 auto;" class="btn-border-small" href=/gebug/rclayout>继续阅读</a></div>
   </div>
   
   
   
   
   <div class="read-more-item">
       <span class="read-more-item-dim">更早的文章</span>
       <h2 class="post-list__post-title post-title"><a href="/gebug/componentr" title="link to 雕虫晓技(一) 组件化">雕虫晓技(一) 组件化</a></h2>
       <p class="excerpt">关于作者GcsSloop，一名 2.5 次元魔法师。微博 | GitHub | 博客前言本文是我工作这段时间的部分经验总结，仅从个人的角度谈一下对工作中编程的看法。今年毕业出来工作，前期需要学习...&hellip;</p>
       <div class="post-list__meta">
          <time datetime="2017-11-06 00:00:00 +0800" class="post-list__meta--date date">2017-11-06</time> &#8226; <span class="post-list__meta--tags tags">GeBug</span>
          <br/><br/>
          <a style="float:none; margin:0 auto;" class="btn-border-small" href=/gebug/componentr>继续阅读</a>
       </div>
   </div>
   
</section>

<!--网易云跟帖-->
<!--
<div id="cloud-tie-wrapper" class="cloud-tie-wrapper"></div>
<script src="https://img1.cache.netease.com/f2e/tie/yun/sdk/loader.js"></script>
<script>
var cloudTieConfig = {
  url: document.location.href, 
  sourceId: "",
  productKey: "a85dba2840134721a7b69a15b2e0f217",
  target: "cloud-tie-wrapper"
};
var yunManualLoad = true;
Tie.loader("aHR0cHM6Ly9hcGkuZ2VudGllLjE2My5jb20vcGMvbGl2ZXNjcmlwdC5odG1s", true);
</script>
-->

<style type="text/css">
.isso-comment > div.avatar {
    border: 0px;
    box-shadow: none;
    display: block;
    float: left;
    width: 7%;
    margin: 3px 15px 0 0;
}
.isso-postbox > .form-wrapper > .auth-section .post-action > input {
    border-radius: 6px;
    padding: 6px;
    padding-left: 16px;
    padding-right: 16px;
    border: 1px solid #CCC;
    background-color: #D58D44;
    cursor: pointer;
    outline: 0;
    color: #fff;
    size: 10;
    line-height: 1.4em;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
.isso-postbox > .form-wrapper > .auth-section .post-action > input:hover {
    background-color: #272822;
}
.isso-postbox > .form-wrapper > .auth-section .post-action > input:active {
    background-color: #986530;
}
</style>

<section id="isso-thread"></section>

<script data-isso="//47.52.58.34:1234/"
        data-isso-css="true"
        data-isso-lang="zh"
        data-isso-reply-to-self="false"
        data-isso-require-author="false"
        data-isso-require-email="false"
        data-isso-max-comments-top="10"
        data-isso-max-comments-nested="5"
        data-isso-reveal-on-click="5"
        data-isso-avatar="true"
        data-isso-avatar-bg="#f0f0f0"
        data-isso-avatar-fg="#9abf88 #5698c4 #e279a3 #9163b6 ..."
        data-isso-vote="true"
        data-vote-levels=""
        src="//47.52.58.34:1234/js/embed.min.js">
        </script>

<!--
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-->
<!-- OneV's Den -->
<!--
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3324997515191619"
     data-ad-slot="9170309685"
     data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
-->

            <section class="footer">
    <footer>
    	<span class="footer__copyright">本站点采用<a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh" target="_blank">知识共享 署名-非商业性使用-禁止演绎 4.0 国际 许可协议</a></span>
        <span class="footer__copyright">本站由 <a href="http://www.GcsSloop.com">@GcsSloop</a> 创建，采用 <a href="https://github.com/GcsSloop/Gcs-Vno-Jekyll" target="_blank">Gcs-Vno-Jekyll</a> 作为主题。<span id="busuanzi_container_site_pv"> 总访问量 <span id="busuanzi_value_site_pv"></span> 次</span> - &copy; 2019</span>
        <span class="footer__sitemap, footer__copyright"><a href="http://www.gcssloop.com/sitemap.xml" target="_blank">Site Map</a>
        <a href="http://www.gcssloop.com/vip" target="_blank">vip</a></span>
    </footer>
</section>

        </div>
    </div>
    
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.3.min.js"></script>

<script type="text/javascript" src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

<script type="text/javascript" src="/js/main.js"></script>

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-82493667-1', 'auto');
  ga('send', 'pageview');

</script>

    
  </body>

</html>
